﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using University.Workshop.Model;
using University.Workshop.DataAccess;
using System.Text.RegularExpressions;

namespace University.Workshop.Business
{
    public static class RateManager
    {
        public static Rate RegisterNewRate(
            string code,
            string service,
            string price,
            string description)
        {
            if (string.IsNullOrEmpty(code) ||
                string.IsNullOrEmpty(service) ||
                string.IsNullOrEmpty(price) ||
                string.IsNullOrEmpty(description))
            {
                throw new DataValidationException("Todos los campos son requeridos.");
            }

            if (!(Regex.IsMatch(service, @"^[\p{L} ]+$")))  //solo letras, inclusive tildes, y espacios
            {
                throw new DataValidationException("Servicio inválido, no puede contener caráceteres no permitidos (por ej: números).");
            }

            if (!(Regex.IsMatch(description, @"^[\p{L} \p{N}]+$")))
            {
                throw new DataValidationException("Descripción inválida, solo se permiten letras y números.");
            }

            //string onlyNumbersMinOne = "\\d{1,20}";
            string onlyNumbersMinOne = "^[0-9]+$";
            if (!(Regex.IsMatch(price, onlyNumbersMinOne)))
            {
                throw new DataValidationException("Precio inválido, debe tener solo números (mínimo 0).");
            }

            string onlyNumbersThree = "\\d{3}";
            if (!(Regex.IsMatch(code, onlyNumbersThree)))
            {
                throw new DataValidationException("Código inválido, debe tener 3 números.");
            }

            Rate existingCode = RateDataAccess.GetRateByCode(code);
            if (existingCode != null)
            {
                throw new DataValidationException("El código no está disponible, ya se encuentra registrado.");
            }

            Rate newRate = new Rate
            {
                Code = code,
                Service = service,
                Price = price,
                Description = description
            };
            
            return newRate;
        }


        public static Rate UpdateRate(
            string code,
            string service,
            string price,
            string description)
        {
            if (string.IsNullOrEmpty(code) ||
                string.IsNullOrEmpty(service) ||
                string.IsNullOrEmpty(price) ||
                string.IsNullOrEmpty(description))
            {
                throw new DataValidationException("Todos los campos son requeridos.");
            }

            if (!(Regex.IsMatch(service, @"^[\p{L} ]+$")))  //solo letras, inclusive tildes, y espacios
            {
                throw new DataValidationException("Servicio inválido, no puede contener caráceteres no permitidos (por ej: números).");
            }

            if (!(Regex.IsMatch(description, @"^[\p{L} \p{N}]+$")))
            {
                throw new DataValidationException("Descripción inválida, solo se permiten letras y números.");
            }

            //string onlyNumbersMinOne = "\\d{1,20}";
            string onlyNumbersMinOne = "^[0-9]+$";
            if (!(Regex.IsMatch(price, onlyNumbersMinOne)))
            {
                throw new DataValidationException("Precio inválido, debe tener solo números (mínimo 0).");
            }

            string onlyNumbersThree = "\\d{3}";
            if (!(Regex.IsMatch(code, onlyNumbersThree)))
            {
                throw new DataValidationException("Código inválido, debe tener 3 números.");
            }

            Rate newRate = new Rate
            {
                Code = code,
                Service = service,
                Price = price,
                Description = description
            };

            return newRate;
        }
    }
}
